/*
 * @lc app=leetcode.cn id=20 lang=cpp
 *
 * [20] 有效的括号
 *
 * https://leetcode-cn.com/problems/valid-parentheses/description/
 *
 * algorithms
 * Easy (36.61%)
 * Total Accepted:    51.6K
 * Total Submissions: 140.5K
 * Testcase Example:  '"()"'
 *
 * 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。
 * 
 * 有效字符串需满足：
 * 
 * 
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * 
 * 
 * 注意空字符串可被认为是有效字符串。
 * 
 * 示例 1:
 * 
 * 输入: "()"
 * 输出: true
 * 
 * 
 * 示例 2:
 * 
 * 输入: "()[]{}"
 * 输出: true
 * 
 * 
 * 示例 3:
 * 
 * 输入: "(]"
 * 输出: false
 * 
 * 
 * 示例 4:
 * 
 * 输入: "([)]"
 * 输出: false
 * 
 * 
 * 示例 5:
 * 
 * 输入: "{[]}"
 * 输出: true
 * 
 */
#include <string>
#include <iostream>
#include <stack>
using namespace std;
class Solution {
public:
    bool isValid(string s) {
        if(s == "")
            return false;
        stack<char> stac;
        for(int i = 0; i < s.size(); i++) {
            if(stac.empty()) {
                stac.push(s[i]);
                continue;
            }
            if((stac.top() == '(' && s[i] == ')') || 
            (stac.top() == '[' && s[i] == ']') ||
            (stac.top() == '{' && s[i] == '}')) {
                stac.pop();
            }
            else {
                stac.push(s[i]);
            }       
        }
        return stac.empty();           
    }
};

int main(int argc, char* argv[]) {
    Solution sol;
    string s = "()";
    string s1 = "()[]{}";
    string s2 = "(]";
    string s3 = "([)]";
    string s4 = "{[]}";
    bool res = sol.isValid(s);
    
    bool res1 = sol.isValid(s1);
    bool res2 = sol.isValid(s2);
    bool res3 = sol.isValid(s3);
    bool res4 = sol.isValid(s4);
    
    cout<<res<<endl;
    
    cout<<res1<<endl;
    cout<<res2<<endl;
    cout<<res3<<endl;
    cout<<res4<<endl;

    getchar();
    return 0;
}

